# Positivo Informatica S/A
#
# Obtem um NS (via argumento ou pede pro operador),
# valida sua formacao de acordo com
# regra do MII e o salva na variavel NS
# Configura a variavel LOCATION como CWB ou MAO de acordo com o NS lido ou
# informado via argumento.
#

import sys
import io
import os

sys.path.append(os.path.dirname(__file__))
from URLs import *

# Tem que inicializar como null, senao os ifs fora daqui nao irao funcionar...
os.environ["NS"] = "null"

# Given a NS, return the factory location following the rule:
# First Digit: 1:Curitiba for POSITIVO, 4:Manaus for POSITIVO, 5:Ilheus for POSITIVO, 8:POSITIVO-VAIO
# Second Digit: 1:VAIO for CBU 2:Reserved 3:Reserved 4:Reserved 5:Quanta for CBU 6:Reserved 7:Pegatron for CBU 8:Curitiba for CKD/SKD 9:Manaus for CKD/SKD
def GetFactoryLocation(NS):
    if len(NS) > 2:
        if NS[0] == '1':
            return 'CWB'
        elif NS[0] == '4':
            return 'MAO'
        elif NS[0] == '5':
            return 'ILH'
        elif NS[0] == '8':
            if NS[1] == '8':
                return 'CWB'
            elif NS[1] == '9':
                return 'MAO'

    print ("NS nao obedece nenhum regra de local da planta fabril. Usando CWB")
    return 'CWB'
    
def GetDigit(letter):
    if letter >= '0' and letter <= '9':
        digit = ord(letter) - ord('0')
    else:
        digit = ord(letter) - 55
        
    return digit

def IsSerialValid(NS):
    if len(NS) != 9:
        return False

    sum = 0
    produtos = [ 8, 1, 2, 4, 3, 7, 3, 5 ]
    
    allDigits = True
    for i in xrange(8):
        digit = GetDigit(NS[i])
        if digit < 0 or digit > 9:
            allDigits = False
        sum += digit * produtos[i]
    
    verificationDigit = sum % 36
    # if all NS chars are digits, and verification code is also a digit,
    # SAP adds 10 to it to avoid a NS with only numbers
    if allDigits and verificationDigit >= 0 and verificationDigit <= 9:
        verificationDigit += 10
            
    return verificationDigit == GetDigit(NS[8])

# Se foi passado um NS por argumento, valida-o e configura o local da fabrica
if len(sys.argv) > 1:
    NumSerie = sys.argv[1]
else:
    NumSerie = None

while True:
    if NumSerie is None:
        NumSerie = raw_input('NS.py - DIGITE O NUMERO DE SERIE: ').upper()
        
    # Agora que eh validado se o NS esta correto, nao precisa mais pedir duas vezes
    # print " "
    # Conf_NumSerie = raw_input('NS.py - Digite o Numero de Serie NOVAMENTE para confirmar: ').upper()
    # print " "
    
    if IsSerialValid(NumSerie):
        os.environ["NS"] = NumSerie
        os.environ["LOCATION"] = GetFactoryLocation(NumSerie)
        print ("NS.py - Localidade deste NS: " + os.environ["LOCATION"])
        sys.exit(0)
    else:
        print ("NS.py - O numero de serie naum eh valido!")
        print ("NS.py - Tente novamente!")
        # Tem que inicializar como null, senao os ifs fora daqui nao irao funcionar...
        os.environ["NS"] = "null"
        NumSerie = None

sys.exit(1)